home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / mmdf / mmdf-IIb.43 / lib / addr / parse.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-05-11  |  2.4 KB  |  126 lines

  1. /* $Header: parse.c,v 1.3 85/01/17 23:07:11 dpk Exp $ */
  2. /* $Log:    parse.c,v $
  3.  * Revision 1.3  85/01/17  23:07:11  dpk
  4.  * Reworked, it now works
  5.  * 
  6.  * Revision 1.2  83/11/18  17:09:41  reilly
  7.  * Steve Kille's version
  8.  *
  9.  *  < 1978  B. Borden       Wrote initial version of parser code
  10.  *  78-80   D. Crocker      Reworked parser into current form
  11.  */
  12. #if DEBUG < 2
  13. main() {
  14.     fprintf(stderr, "parse is useless when compiled with -DDEBUG=x (x < 2)\n");
  15. }
  16. #else
  17. #include "ap_lex.h"
  18. #include "util.h"
  19. #include "mmdf.h"
  20. #include "ap.h"
  21.  
  22. extern char ap_llex;
  23. extern char *locname;
  24. AP_ptr ap_fullparse ();
  25.  
  26. extern LLog *logptr;
  27.  
  28.  
  29. extern char *namtab[],
  30.        *typtab[];
  31. extern int debug;
  32.  
  33. main (argc, argv)
  34. {
  35.     AP_ptr ap_fp;
  36.     int    getach();
  37.  
  38.     mmdf_init ("PARSE");
  39.     logptr -> ll_level = LLOGFTR;
  40.     if (argc == 2)
  41.     debug++;
  42.  
  43.     for (;;)
  44.     {
  45.     printf ("Parse: ");
  46.  
  47.     switch (ap_fp = ap_fullparse (getach)) {
  48.     case NOTOK:
  49.         printf ("\nNOTOK: on %s\n", namtab[ap_llex]);
  50.         break;
  51.     case DONE:
  52.         printf ("\nNOTOK: on %s\n", namtab[ap_llex]);
  53.         break;
  54.     case OK:
  55.         printf ("\nOK?: on %s\n", namtab[ap_llex]);
  56.         break;
  57.     default:
  58.         printf ("\n\nAccept\n");
  59.         pretty (ap_fp);
  60.         printf ("\n");
  61.         while (ap_sqdelete (ap_fp, (AP_ptr)0) != 0);
  62.         ap_free (ap_fp);  /* delete full string         */
  63.         ap_fp = (AP_ptr) 0;
  64.         continue;
  65.     }
  66.         break;
  67.     }
  68.     exit (0);
  69. }
  70.  
  71. getach ()
  72. {
  73.     int    c;
  74.  
  75.     c = getchar();
  76.     if (c == '\n')
  77.     return (0);
  78.     if (c == EOF)
  79.     exit(0);
  80.     return (c);
  81. }
  82.  
  83. pretty (ap)
  84. register AP_ptr ap;
  85. {
  86.     register int    depth = 1;
  87.  
  88.     do {
  89.     switch (ap -> ap_obtype)
  90.     {
  91.         case APV_EGRP: 
  92.         case APV_EPER: 
  93.         depth -= 2;
  94.     }
  95.  
  96.     printf ("%.*s%-9s", depth, "          ");
  97.         if (ap -> ap_obtype >= 0 && ap -> ap_obtype <= 13)
  98.         printf("%s %s", typtab[ap -> ap_obtype],
  99.             ap -> ap_obvalue ? ap -> ap_obvalue : "NIL");
  100.         else
  101.         printf("BOGUS!(%d) %s", ap -> ap_obtype,
  102.             ap -> ap_obvalue ? ap -> ap_obvalue : "NIL");
  103.         switch (ap -> ap_ptrtype) {
  104.     case APP_NIL:
  105.         printf("\t(NIL)\n");
  106.             break;
  107.     case APP_NXT:
  108.         printf("\t(NXT)\n\n");
  109.             break;
  110.     case APP_ETC:
  111.         printf("\t(ETC)\n", ap -> ap_ptrtype);
  112.             break;
  113.         default:
  114.         printf("\t(BOGUS!)\n", ap -> ap_ptrtype);
  115.         }
  116.     switch (ap -> ap_obtype)
  117.     {
  118.         case APV_NGRP: 
  119.         case APV_NPER: 
  120.         depth += 2;
  121.     }
  122.     } while ((ap = ap -> ap_chain) != (AP_ptr)0);
  123.     printf ("End on null pointer\n");
  124. }
  125. #endif
  126.